home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / set.cpp < prev    next >
C/C++ Source or Header  |  1999-05-14  |  6KB  |  216 lines

  1. // $Id: set.cpp,v 1.3 1999/01/25 20:00:31 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #include "set.h"
  11. #include "config.h"
  12.  
  13. int SymbolSet::primes[] = {DEFAULT_HASH_SIZE, 101, 401, MAX_HASH_SIZE};
  14.  
  15. void SymbolSet::Rehash()
  16. {
  17.     hash_size = primes[++prime_index];
  18.  
  19.     delete [] base;
  20.     base = (ShadowSymbol **) memset(new ShadowSymbol *[hash_size], 0, hash_size * sizeof(ShadowSymbol *));
  21.  
  22.     for (int k = 0; k < symbol_pool.Length(); k++)
  23.     {
  24.         ShadowSymbol *shadow = symbol_pool[k];
  25.         int i = shadow -> Identity() -> index % hash_size;
  26.         shadow -> next = base[i];
  27.         base[i] = shadow;
  28.     }
  29.  
  30.     return;
  31. }
  32.  
  33.  
  34. SymbolSet::~SymbolSet()
  35. {
  36. /*
  37. int n;
  38. int num_slots = 0;
  39. int total = 0;
  40. for (n = 0; n < hash_size; n++)
  41. {
  42. int num = 0;
  43. for (ShadowSymbol *s = base[n]; s; s = s -> next)
  44.     num++;
  45. if (num > 0)
  46. {
  47. num_slots++;
  48. total += num;
  49. }
  50. }
  51.  
  52. if (num_slots > 0)
  53. {
  54. cout << "\nDestroying a set with base size " << hash_size << " containing " << num_slots << " non-empty slots\n";
  55. for (n = 0; n < hash_size; n++)
  56. {
  57. int num = 0;
  58. for (ShadowSymbol *s = base[n]; s; s = s -> next)
  59.     num++;
  60. if (num > 0)
  61. cout << "    slot " << n << " contains " << num << " element(s)\n";
  62. }
  63. }
  64. if (hash_size < total)
  65.     total = total;
  66. */
  67.     SetEmpty();
  68.     delete [] base;
  69. }
  70.  
  71.  
  72. bool SymbolSet::operator==(SymbolSet& rhs)
  73. {
  74.     if (this != &rhs)
  75.     {
  76.         if (symbol_pool.Length() != rhs.symbol_pool.Length())
  77.             return false;
  78.  
  79.         for (int i = 0; i < symbol_pool.Length(); i++)
  80.         {
  81.             ShadowSymbol *shadow = symbol_pool[i];
  82.             Symbol *symbol = shadow -> symbol;
  83.             for (int k = 0; symbol; symbol = (Symbol *) (k < shadow -> NumConflicts() ? shadow -> Conflict(k++) : NULL))
  84.             {
  85.                 if (! rhs.IsElement(symbol))
  86.                     return false;
  87.             }
  88.         }
  89.     }
  90.  
  91.     return true;
  92. }
  93.  
  94.  
  95. //
  96. // Union the set in question with the set passed as argument: "set"
  97. //
  98. void SymbolSet::Union(SymbolSet &set)
  99. {
  100.     if (this != &set)
  101.     {
  102.         for (int i = 0; i < set.symbol_pool.Length(); i++)
  103.         {
  104.             ShadowSymbol *shadow = set.symbol_pool[i];
  105.             Symbol *symbol = shadow -> symbol;
  106.             for (int k = 0; symbol; symbol = (Symbol *) (k < shadow -> NumConflicts() ? shadow -> Conflict(k++) : NULL))
  107.                 AddElement(symbol);
  108.         }
  109.     }
  110.  
  111.     return;
  112. }
  113.  
  114.  
  115. //
  116. // Intersect the set in question with the set passed as argument: "set"
  117. //
  118. void SymbolSet::Intersection(SymbolSet &set)
  119. {
  120.     if (this != &set)
  121.     {
  122.         Tuple<Symbol *> old_symbol_pool(this -> symbol_pool.Length());
  123.         for (int i = 0; i < this -> symbol_pool.Length(); i++)
  124.         {
  125.             ShadowSymbol *shadow = this -> symbol_pool[i];
  126.             Symbol *symbol = shadow -> symbol;
  127.             for (int k = 0; symbol; symbol = (Symbol *) (k < shadow -> NumConflicts() ? shadow -> Conflict(k++) : NULL))
  128.                 old_symbol_pool.Next() = symbol;
  129.         }
  130.  
  131.         this -> SetEmpty();
  132.  
  133.         for (int j = 0; j < old_symbol_pool.Length(); j++)
  134.         {
  135.             if (set.IsElement(old_symbol_pool[j]))
  136.                 AddElement(old_symbol_pool[j]);
  137.         }
  138.     }
  139.  
  140.     return;
  141. }
  142.  
  143.  
  144. //
  145. // Return a bolean value indicating whether or not the set in question intersects the set passed as argument: "set"
  146. // i.e., is there at least one element of set that is also an element of "this" set.
  147. //
  148. bool SymbolSet::Intersects(SymbolSet &set)
  149. {
  150.     for (int i = 0; i < set.symbol_pool.Length(); i++)
  151.     {
  152.         ShadowSymbol *shadow = set.symbol_pool[i];
  153.         Symbol *symbol = shadow -> symbol;
  154.         for (int k = 0; symbol; symbol = (Symbol *) (k < shadow -> NumConflicts() ? shadow -> Conflict(k++) : NULL))
  155.             if (IsElement(symbol))
  156.                 return true;
  157.     }
  158.  
  159.     return false;
  160. }
  161.  
  162.  
  163. //
  164. // Remove element from the set
  165. //
  166. void SymbolSet::RemoveElement(Symbol *element)
  167. {
  168.     NameSymbol *name_symbol = element -> Identity();
  169.     int i = name_symbol -> index % hash_size;
  170.     ShadowSymbol *previous = NULL,
  171.                  *shadow;
  172.     for (shadow = base[i]; shadow; previous = shadow, shadow = shadow -> next)
  173.     {
  174.         if (shadow -> Identity() == name_symbol)
  175.         {
  176.             Symbol *symbol = shadow -> symbol;
  177.             int k;
  178.             for (k = 0; symbol; symbol = (Symbol *) (k < shadow -> NumConflicts() ? shadow -> Conflict(k++) : NULL))
  179.             {
  180.                 if (symbol == element)
  181.                     break;
  182.             }
  183.  
  184.             if (symbol)
  185.             {
  186.                 if (shadow -> NumConflicts() == 0)
  187.                     break;
  188.                 shadow -> RemoveConflict(k - 1);
  189.             }
  190.  
  191.             return;
  192.         }
  193.     }
  194.  
  195.     if (shadow) // element is the only object contained in shadow
  196.     {
  197.         if (previous == NULL)
  198.              base[i] = shadow -> next;
  199.         else previous -> next = shadow -> next;
  200.  
  201.         int last_index = symbol_pool.Length() - 1;
  202.         if (shadow -> pool_index != last_index)
  203.         {// move last element to position previously occupied by element being deleted
  204.             symbol_pool[last_index] -> pool_index = shadow -> pool_index;
  205.             symbol_pool[shadow -> pool_index] = symbol_pool[last_index];
  206.         }
  207.  
  208.         symbol_pool.Reset(last_index); // remove last slot in symbol_pool
  209.  
  210.         delete shadow;
  211.     }
  212.  
  213.     return;
  214. }
  215.  
  216.